package com.harkjeans.javacoding.basic;

/**
 * ClassName: Exercise6
 * Package: com.harkjeans.javacoding.basic
 * Description: 练习6:数字加密
 *
 * @Author harkjeans
 * @Create 2025/10/14 16:15
 * @Version 1.0
 */

import java.util.Scanner;

/**
 * 某系统的数字密码（大于0），比如1983，采用加密方式进行传输。
 * 先得到每位数，然后每位数都加上5 , 再对10求余，最后将所有数字反转，得到一串新数。
 */
public class Exercise6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 1. 获取输入
        int originalNumber = getValidInput(scanner);
        // 2. 执行加密过程
        int encryptedNumber = encryptNumber(originalNumber);
        // 3. 输出结果
        System.out.println(encryptedNumber);

    }


    /**
     * 获取有效输入(大于0的数)
     * @param scanner
     * @return
     */
    private static int getValidInput(Scanner scanner) {
        int number;
        while(true){
            System.out.println("请输入一个大于0的整数");
            if(scanner.hasNextInt()){
                number = scanner.nextInt();
                if(number > 0){
                    break;
                }else{
                    System.out.println("请输入大于0的数!");
                }
            }else{
                System.out.println("请输入有效整数!");
                scanner.next(); // 清除无效输入
            }
        }
        return number;
    }

    /**
     * 数字加密核心算法
     * @param number
     * @return
     */
    private static int encryptNumber(int number) {
        // 1. 获取每一位数字
        int[] digits = getDigits(number);
        // 2. 每位数字加5
        for (int i = 0; i < digits.length; i++) {
            digits[i] = digits[i] + 5;
        }
        // 3. 对10求余
        for (int i = 0; i < digits.length; i++) {
            digits[i] = digits[i] % 10;
        }
        // 4. 数字反转
        for (int i = 0, j = digits.length - 1; i < j; i++, j--) {
            int temp = digits[i];
            digits[i] = digits[j];
            digits[j] = temp;
        }
        // 5. 组合成新的数字
        int res = combineDigits(digits);
        return res;
    }


    /**
     * 获取每一位数字
     * @param number
     * @return
     */
    private static int[] getDigits(int number) {
        // 计算数字的位数
        int temp = number;
        int count = 0;
        while(temp > 0){
            temp /= 10;
            count++;
        }

        // 获取每一位数字
        int[] digits = new int[count];
        temp = number;
        for (int i = digits.length - 1; i >= 0; i--) {
            digits[i] =  temp % 10;
            temp /= 10;
        }
        return digits;
    }

    /**
     * 组合成新的数字
     * @param digits
     * @return
     */
    private static int combineDigits(int[] digits) {
        int res = 0;
        for (int i = 0; i < digits.length; i++) {
            res = res * 10 + digits[i];
        }
        return res;
    }


}
